博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django项目:CRM(客户关系管理系统)--63--53PerfectCRM实现CRM客户报名流程缴费
阅读量:4310 次
发布时间:2019-06-06

本文共 34401 字,大约阅读时间需要 114 分钟。

 

1 #urls.py 2  3 """PerfectCRM URL Configuration 4  5 The `urlpatterns` list routes URLs to views. For more information please see: 6     https://docs.djangoproject.com/en/2.0/topics/http/urls/ 7 Examples: 8 Function views 9     1. Add an import:  from my_app import views10     2. Add a URL to urlpatterns:  path('', views.home, name='home')11 Class-based views12     1. Add an import:  from other_app.views import Home13     2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')14 Including another URLconf15     1. Import the include() function: from django.urls import include, path16     2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))17 """18 from django.contrib import admin19 from django.urls import path20 21 # ————————02PerfectCRM创建ADMIN页面————————22 from django.conf.urls import url  # URL23 from django.conf.urls import include # 分发URL24 # ————————02PerfectCRM创建ADMIN页面————————25 26 # ————————46PerfectCRM实现登陆后页面才能访问————————27 from PerfectCRM import main_views28 # ————————46PerfectCRM实现登陆后页面才能访问————————29 30 urlpatterns = [31     path('admin/', admin.site.urls),32     33 # ————————02PerfectCRM创建ADMIN页面————————34     url(r'^king_admin/', include("king_admin.king_urls")),  # 自定义admin35 # ————————02PerfectCRM创建ADMIN页面————————36     37 # ————————03PerfectCRM创建基本数据————————38     url(r'^DBadd/', include("DBadd.DBadd_urls")),  # 添加随机数据39 # ————————03PerfectCRM创建基本数据————————40     # ————————38PerfectCRM实现全局账号登录注销————————41     url(r'^gbacc/', include("gbacc.gbacc_urls")),  # 全局账号登录注销42     # ————————38PerfectCRM实现全局账号登录注销————————43 44     # ————————42PerfectCRM实现AJAX全局账号注册————————45     url(r'^gbacc/', include("gbacc.gbacc_ajax_urls")),  # 全局账号登录注销46     # ————————42PerfectCRM实现AJAX全局账号注册————————47 48     # ————————46PerfectCRM实现登陆后页面才能访问————————49     url(r'^$', main_views.PortalView.as_view()),50     # ————————46PerfectCRM实现登陆后页面才能访问————————51 52     # ————————47PerfectCRM实现CRM客户报名流程————————53     url(r'^bpm/', include("bpm.sales.sales_urls")),  # 业务流程54     # ————————47PerfectCRM实现CRM客户报名流程————————55 56     # ————————53PerfectCRM实现CRM客户报名流程缴费————————57     url(r'^bpm/', include("bpm.financial.financial_urls")),  # 财务缴费58     # ————————53PerfectCRM实现CRM客户报名流程缴费————————59 60 ]
#urls.py

 

 

1 # financial_urls.py 2  3 from django.conf.urls import url 4 from bpm.financial import financial_views 5  6 urlpatterns = [ 7     url(r'^not_payment/$', financial_views.not_payment, name="not_payment"),  # 报名流程四  未 缴费 查询 8     url(r'^already_payment/$', financial_views.already_payment, name="already_payment"),  # 报名流程四  已 缴费 查询 9     url(r'^payment/(\d+)/$', financial_views.payment, name="payment"),  # 报名流程四    缴费   #财务10 ]11 # ————————47PerfectCRM实现CRM客户报名流程————————
# financial_urls.py

 

 

 

 

1 # financial_views.py 2 # ————————53PerfectCRM实现CRM客户报名流程缴费———————— 3 from crm import models #数据库 4 from django.shortcuts import redirect,render   #页面返回 5 from bpm.bpm_auxiliary import bpm_forms   #自定制 forms 6 from  django.contrib.auth.decorators import login_required # 登陆后页面才能访问 7 # #待缴费 8 def not_payment(request): 9     sign=models.Enrollment.objects.all()#所有的报名表10     return render(request, 'bpm_financial/not_payment.html', locals())#11 # 已缴费12 def already_payment(request):13     sign=models.Enrollment.objects.all()#所有的报名表14     return render(request, 'bpm_financial/already_payment.html', locals())#15 #缴费视图16 @login_required # 登陆后页面才能访问17 def payment(request,enroll_id):18     sign=models.Payment.objects.all()#所有的报名表#前端对比用户#缴费记录19     enroll_obj=models.Enrollment.objects.get(id=enroll_id)#取对象20     errors={}  #错误信息21     if request.method=="POST":22         payment_amount=request.POST.get('amount')#缴费金额23         consultant = models.UserProfile.objects.get(id=request.user.id)  #财务人员 #当前登陆人24         if payment_amount:25             payment_amount=int(payment_amount)  #转数字类型26             if payment_amount<500:27                 errors['err']='缴费金额不得低于500元!'28             else: #生成forms29                 payment_obj=models.Payment.objects.create(30                     customer=enroll_obj.customer,##客户表 学员31                     course=enroll_obj.enrolled_class.course,#所报课程32                     consultant=consultant,# 财务人员33                     amount=payment_amount,#缴费金额34                 )35                 enroll_obj.Pay_cost=True#已缴费36                 enroll_obj.save()   #保存37                 enroll_obj.customer.status=0#修改报名状态 为已报名#根据数据库38                 enroll_obj.customer.save()  #保存39                 return redirect('/bpm/not_payment')#客户表40         else:41             errors['err']='金额不能为空!'42     else:43         payment_form= bpm_forms.PaymentForm()#生成表单44     return render(request, 'bpm_financial/payment.html', locals())45 # ————————53PerfectCRM实现CRM客户报名流程缴费————————
# financial_views.py

 

 

 

 

 

 

 

1 #models.py  2   3 # ————————01PerfectCRM基本配置ADMIN————————  4   5 from django.db import models  6 # Create your models here.  7   8 """  9 #运行 Terminal 10 #    生成 数据表 11 #    python manage.py makemigrations 12 #   数据表 迁移 13 #    python manage.py migrate 14 """ 15  16 """01校区表""" 17 class Branch(models.Model): 18     name = models.CharField(max_length=128,unique=True) #校区名#CharField作用是保存文本,定长的变量类型 19     addr = models.CharField(max_length=128) #地址 20     def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。 21         return self.name #返回 #校区名 22     class Meta: #通过一个内嵌类 "class Meta" 给你的 model 定义元数据 23         verbose_name_plural =  "01校区表" #verbose_name_plural给你的模型类起一个更可读的名字 24  25 """02班级表""" 26 class ClassList(models.Model): 27     #ForeignKey就是表与表之间的某种约定的关系  #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。 28     branch = models.ForeignKey("Branch",on_delete=models.CASCADE)#校区    关联到  校区表 29     course = models.ForeignKey("Course",on_delete=models.CASCADE) #课程   关联到   课程表 30  31     # ————————48PerfectCRM实现CRM客户报名流程学生合同———————— 32     contract = models.ForeignKey('ContractTemplate', blank=True, null=True, default=1,on_delete=models.CASCADE)  # 合同表 33     # ————————48PerfectCRM实现CRM客户报名流程学生合同———————— 34  35     class_type_choices = ( #上课形式 36                           (0,'面授(脱产)'), 37                           (1,'面授(周末)'), 38                           (2,'网络班'),) 39     #PositiveSmallIntegerField正小整数 0 ~ 32767 #choices是Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作 40     class_type = models.SmallIntegerField(choices=class_type_choices)#上课形式 41  42     #PositiveSmallIntegerField正小整数 0 ~ 32767 43     semester = models.PositiveSmallIntegerField(verbose_name="学期") #课程的第几期 44  45     #ManyToManyField多对多和外键工作方式相同,只不过我们处理的是QuerySet而不是模型实例。 46     teachers = models.ManyToManyField("UserProfile") # 老师   关联到    账号表 47  48     start_date = models.DateField(verbose_name="开班日期") #DateField 日期格式 YYYY-MM-DD #verbose_name是Admin中显示的字段名称 49  50     # DateField 日期格式 YYYY-MM-DD #verbose_name是Admin中显示的字段名称 #Django可空#数据库可以为空 51     end_date = models.DateField(verbose_name="结业日期",blank=True,null=True) 52  53     def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。 54         return "%s %s %s" %(self.branch,self.course,self.semester) #返回 #%s格式化输出字符串 #校区#课程# 学期 55     class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据 56         unique_together=('branch','course','semester')  #联合索引 57         verbose_name_plural = "02班级表" #verbose_name_plural给你的模型类起一个更可读的名字 58  59 """03课程表,可以报名那些课程""" 60 class Course(models.Model): 61     name = models.CharField(max_length=64,unique=True)#课程名 #CharField作用是保存文本,定长的变量类型 62     price = models.PositiveSmallIntegerField(verbose_name="学费")#学费#PositiveSmallIntegerField正小整数 0 ~ 32767 63     period = models.PositiveSmallIntegerField(verbose_name="周期(月)") #PositiveSmallIntegerField正小整数 0 ~ 32767 64     outline = models.TextField() #课程大纲  #文本类型 65     def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。 66         return self.name #返回 #课程名 67     class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据 68         verbose_name_plural =  "03课程表"#verbose_name_plural给你的模型类起一个更可读的名字 69  70 '''04客户信息表''' 71 class Customer(models.Model): 72     name = models.CharField(max_length=32,blank=True,null=True)#客户名#CharField定长文本 #名字最长32 # Django可空 #数据库可以为空 73     qq = models.CharField(max_length=64,unique=True) #QQ号#CharField定长文本 #名字最长64 #唯一,不能重复 74     qq_name = models.CharField(max_length=64,blank=True,null=True)#QQ名 #CharField定长文本 #名字最长64 # Django可空 #数据库可以为空 75     phone = models.CharField(max_length=64,blank=True,null=True)#手机号 #CharField定长文本 #名字最长64 # Django可空 #数据库可以为空 76  77     # ————————48PerfectCRM实现CRM客户报名流程学生合同———————— 78     id_num=models.CharField(max_length=64,blank=True,null=True,verbose_name='身份证号')#身份证号 79     email=models.EmailField(max_length=64,blank=True,null=True,verbose_name='邮箱')#email 80     sex_choices=((0,'保密'),(1,'男'),(2,'女')) 81     sex=models.SmallIntegerField(choices=sex_choices,default=0,verbose_name='性别') 82     # ————————48PerfectCRM实现CRM客户报名流程学生合同———————— 83  84     # ————————53PerfectCRM实现CRM客户报名流程缴费———————— 85     status_choices = ((0, '已报名'), (1, '未报名'), (2, '已退学')) 86     status = models.SmallIntegerField(choices=status_choices, default=1)  # 学员状态 87     # ————————53PerfectCRM实现CRM客户报名流程缴费———————— 88  89     source_choices = ( #客户渠道来源 (内存生成) 90                       (0,'转介绍'), 91                       (1,'QQ群'), 92                       (2,'官网'), 93                       (3,'百度推广'), 94                       (4,'51CTO'), 95                       (5,'知乎'), 96                       (6,'市场推广'),) 97     #PositiveSmallIntegerField正小整数 0 ~ 32767(省空间)#choices是Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作 98     source = models.SmallIntegerField(choices=source_choices)#客户渠道来源 99 100     #CharField定长文本#verbose_name是Admin中显示的字段名称#名字最长64 # Django可空 #数据库可以为空101     referral_from = models.CharField(verbose_name="转介绍人qq",max_length=64,blank=True,null=True) #来自谁介绍的102 103     #ForeignKey就是表与表之间的某种约定的关系#verbose_name是Admin中显示的字段名称 #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。104     consult_courses = models.ForeignKey("Course",verbose_name="咨询课程", on_delete=models.CASCADE) #关联到 课程表105 106     content= models.TextField(verbose_name="咨询详情") #TextField无限制长度的文本#verbose_name是Admin中显示的字段名称107 108     #ManyToManyField多对多和外键工作方式相同,只不过我们处理的是QuerySet而不是模型实例。109     tags = models.ManyToManyField("Tag",blank=True)#多对多关联到 标签表110 111     #ForeignKey就是表与表之间的某种约定的关系  #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。112     consultant = models.ForeignKey("UserProfile", on_delete=models.CASCADE) #关联到  账号表113 114     memo = models.TextField(blank=True,null=True)#备注#TextField无限制长度的文本#Django可空#数据库可以为空115 116     #DateTimeField日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] #auto_now_add创建时间(只读)117     date =  models.DateTimeField(auto_now_add=True)#创建时间(数据库自增)118 119     def __str__(self): #__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。120         return self.qq  #返回 #QQ号121 122     class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据123         verbose_name_plural =  "04客户表" #verbose_name_plural给你的模型类起一个更可读的名字124 125 # ————————48PerfectCRM实现CRM客户报名流程学生合同————————126 #合同模版127 class ContractTemplate(models.Model):128     name=models.CharField('合同名称',max_length=64,unique=True)129     template=models.TextField()130 131     def __str__(self):132         return self.name133     class Meta:134         verbose_name_plural='合同表'135 # ————————48PerfectCRM实现CRM客户报名流程学生合同————————136 137 138 """05客户跟进表"""139 class CustomerFollowUp(models.Model):140 141     #ForeignKey就是表与表之间的某种约定的关系 #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。142     customer = models.ForeignKey("Customer", on_delete=models.CASCADE)#客户名 #关联到  客户信息表143 144     content = models.TextField(verbose_name="跟进内容")#跟进的内容#TextField无限制长度的文本#verbose_name是Admin中显示的字段名称145 146     #ForeignKey就是表与表之间的某种约定的关系  #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。147     consultant =models.ForeignKey("UserProfile", on_delete=models.CASCADE) #关联到  账号表148 149     intention_choices =(  #报名状态150                         (0,'2周内报名'),151                         (1,'1个月内报名'),152                         (2,'近期无报名计划'),153                         (3,'已在其它机构报名'),154                         (4,'已报名'),155                         (5,'已拉黑'),)156     #PositiveSmallIntegerField正小整数 0 ~ 32767(省空间)#choices是Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作157     intention=models.SmallIntegerField(choices=intention_choices) #报名状态158 159     #DateTimeField日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] #auto_now_add创建时间(只读)160     date =  models.DateTimeField(auto_now_add=True)#创建时间(数据库自增)161 162     def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。163         return "<%s:%s>" %(self.customer.qq,self.intention) #返回#格式化字符串#跨表里的QQ号#报名状态164     class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据165         verbose_name_plural =  "05客户跟进表"#verbose_name_plural给你的模型类起一个更可读的名字166 167 """06学员报名信息表"""168 class Enrollment(models.Model):169     # ForeignKey就是表与表之间的某种约定的关系#verbose_name是Admin中显示的字段名称 #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。170     customer = models.ForeignKey("Customer",on_delete=models.CASCADE)#学员名字 #关联到  客户信息表171     enrolled_class = models.ForeignKey("ClassList",verbose_name="所报班级",on_delete=models.CASCADE)#关联到  班级表172     consultant = models.ForeignKey("UserProfile",verbose_name="课程顾问",on_delete=models.CASCADE) #关联到  账号表173 174     # ————————52PerfectCRM实现CRM客户报名流程学生合同审核————————175     contract_review = models.CharField(max_length=256, blank=True, null=True, verbose_name="合同审核")  # 合同审核176     # ————————52PerfectCRM实现CRM客户报名流程学生合同审核————————177 178     #BooleanField布尔值类型#default=False默认(True)不允许出现空字符#verbose_name是Admin中显示的字段名称179     contract_agreed = models.BooleanField(default=False,verbose_name="学员已经同意合同")#学员看合同180     contract_approved = models.BooleanField(default=False,verbose_name="合同已经审核") #谁审核181 182     # ————————53PerfectCRM实现CRM客户报名流程缴费————————183     Pay_cost= models.BooleanField(default=False,verbose_name="缴费") #缴费状态#是不是交定金184     # ————————53PerfectCRM实现CRM客户报名流程缴费————————185 186     # DateTimeField日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] #auto_now_add创建时间(只读)187     date = models.DateTimeField(auto_now_add=True)#创建时间(数据库自增)188 189     def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。190         return "%s %s" %(self.customer,self.enrolled_class)#返回#格式化字符串#学员名字#所报班级191     class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据192         unique_together =  ("customer","enrolled_class")#联合索引193         verbose_name_plural =  "06学员报名信息表"#verbose_name_plural给你的模型类起一个更可读的名字194 195 """07缴费记录表"""196 class Payment(models.Model):197     #ForeignKey就是表与表之间的某种约定的关系#verbose_name是Admin中显示的字段名称 #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。198     customer = models.ForeignKey("Customer",on_delete=models.CASCADE)#学员名字        关联到  客户信息表199     course = models.ForeignKey("Course",verbose_name="所报课程",on_delete=models.CASCADE)#关联到  课程表200 201     #PositiveSmallIntegerField正小整数 0 ~ 32767 #verbose_name是Admin中显示的字段名称#默认值=500202     amount = models.PositiveIntegerField(verbose_name="数额",default=500)#缴费数额203 204     #ForeignKey就是表与表之间的某种约定的关系#CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。205     consultant = models.ForeignKey("UserProfile",on_delete=models.CASCADE)#缴费给谁 关联到  账号表 #财务人员206 207     #DateTimeField日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] #auto_now_add创建时间(只读)208     date=models.DateTimeField(auto_now_add=True)#创建时间(数据库自增)209 210     def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。211         return "%s %s" %(self.customer,self.amount)#返回#格式化字符串#学员名字#缴费数额212     class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据213         verbose_name_plural = "07缴费记录表"#verbose_name_plural给你的模型类起一个更可读的名字214 215 """08每节课上课纪录表"""216 class CourseRecord(models.Model):217     # ForeignKey就是表与表之间的某种约定的关系#verbose_name是Admin中显示的字段名称 #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。218     from_class = models.ForeignKey("ClassList",verbose_name="班级",on_delete=models.CASCADE) #那个班级219 220     #PositiveSmallIntegerField正小整数 0 ~ 32767 #verbose_name是Admin中显示的字段名称221     day_num = models.PositiveSmallIntegerField(verbose_name="第几节(天)") #第几节课222 223     # ForeignKey就是表与表之间的某种约定的关系 #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。224     teacher = models.ForeignKey("UserProfile",on_delete=models.CASCADE)#老师是谁    关联到    账号表225 226     #BooleanField布尔值类型#default=True默认(True)不允许出现空字符227     has_homework = models.BooleanField(default=True) #有没有作业228 229     # CharField定长文本#名字最长128#Django可空#数据库可以为空230     homework_title = models.CharField(max_length=128,blank=True,null=True) #作业标题231 232     #TextField无限制长度的文本#Django可空#数据库可以为空233     homework_content = models.TextField(blank=True,null=True) #作业内容234 235     #TextField无限制长度的文本#verbose_name是Admin中显示的字段名称236     outline =models.TextField(verbose_name="本节课程大纲") #课程主要讲什么237 238     # DateTimeField日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] #auto_now_add创建时间(只读)239     date = models.DateField(auto_now_add=True)#创建时间(数据库自增)240 241     def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。242         return " %s:%s" %(self.from_class,self.day_num)#返回#格式化字符串#班级#第几节(天)243     class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据244         unique_together = ("from_class","day_num") #联合索引245         verbose_name_plural = "08每节课上课纪录表" #verbose_name_plural给你的模型类起一个更可读的名字246 247 """09学习纪录"""248 class StudyRecord(models.Model):249     # ForeignKey就是表与表之间的某种约定的关系 #CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。250     student = models.ForeignKey("Enrollment",on_delete=models.CASCADE)#学生名字   关联到    学员报名信息表251     course_record = models.ForeignKey("CourseRecord",on_delete=models.CASCADE)#开课记录   # 关联到    每节课上课纪录表252 253     attendance_choices = (# 本节课上课状态记录254                             (0,"已签到"),255                             (1,"迟到"),256                             (2,"缺勤"),257                             (3,"早退"),)258     #PositiveSmallIntegerField正小整数 0 ~ 32767(省空间)#choices是Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作259     attendance = models.SmallIntegerField(choices=attendance_choices) # 本节课上课状态记录260 261     score_choices = (#学习成绩262                      (100,"A+"),263                      (90,"A"),264                      (85,"B+"),265                      (80,"B"),266                      (75,"B-"),267                      (70,"C+"),268                      (65,"C"),269                      (40,"C-"),270                      (-20,"D"),271                      (-50,"COPY"),272                      (0,"N/A"),)273     #PositiveSmallIntegerField正小整数 0 ~ 32767(省空间)#choices是Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作274     score = models.SmallIntegerField(choices=score_choices) #学习成绩275 276     memo = models.TextField(blank=True,null=True)#TextField无限制长度的文本#Django可空#数据库可以为空277 278     # DateTimeField日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] #auto_now_add创建时间(只读)279     date = models.DateField(auto_now_add=True)#创建时间(数据库自增)280 281     def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。282         return "%s %s %s" % (self.student, self.course_record, self.score)#返回#格式化字符串#学生名字#开课记录#学习成绩283     class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据284         unique_together = ('student','course_record')#联合索引#学生名字#开课记录285         verbose_name_plural =  "09学习纪录"#verbose_name_plural给你的模型类起一个更可读的名字286 287 # ————————34PerfectCRM实现CRM自定义用户————————288 # """10账号表"""289 # class UserProfile(models.Model):290 #     from django.contrib.auth.models import User  # 使用django内置的用户表291 #292 #     #OneToOneField一对一  #User是django Admin里的账号表#CASCADE从父表删除或更新且自动删除或更新子表中匹配的行。293 #     user = models.OneToOneField(User,on_delete=models.CASCADE)# 用户名 #创建外键,关联django用户表294 #295 #     name = models.CharField(max_length=32) #账号名(扩展用户字段)#CharField定长文本296 #297 #     #ManyToManyField多对多和外键工作方式相同,只不过我们处理的是QuerySet而不是模型实例。#Django可空298 #     roles = models.ManyToManyField("Role",blank=True) #角色(权限)   # 双向一对多==多对多299 #300 #     def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。301 #         return self.name #返回 #账号名302 #     class Meta: #通过一个内嵌类 "class Meta" 给你的 model 定义元数据303 #         verbose_name_plural = "10账号表"#verbose_name_plural给你的模型类起一个更可读的名字304 # ————————34PerfectCRM实现CRM自定义用户————————305 306 # ————————34PerfectCRM实现CRM自定义用户————————307 #10账号表,创建用户和超级用户308 from django.contrib.auth.models import BaseUserManager309 class UserProfileManager(BaseUserManager):310     def create_user(self, email, name, password=None):311         """312       创建并保存一个用户用给定的邮件,日期313       出生和密码。314         """315         if not email:#没有email 报错316             raise ValueError('用户必须有一个电子邮件地址')317 318         user = self.model(319             email=self.normalize_email(email),#验证邮箱格式320             name=name,321         )322         user.set_password(password)#加密323         user.is_active = True324         user.save(using=self._db)325         return user326     def create_superuser(self, email, name, password):327         """328       创建并保存一个超级用户具有给定邮件,日期329       出生和密码。330         """331         user = self.create_user(email,332             password=password,333             name=name334         )335         user.is_active = True336         user.is_superuser = True337         user.save(using=self._db)338         return user339 340 """10账号表"""341 """342 343 #删除数据库344 345 #调用objects = UserProfileManager()#创建账号 #关联这个函数346 347 #运行 Terminal348 #    生成 数据表349 #    python manage.py makemigrations350 #   数据表 迁移351 #    python manage.py migrate352 Django Admin里账号密码重置方法353 #运行 Terminal  354 python manage.py createsuperuser355 356 Email address:          admin@qq.com357 用户名 :                 admin358 Password:               admin123456359 Password (again):       admin123456360 """361 from django.contrib.auth.models import AbstractBaseUser362 # ————————35PerfectCRM实现CRM重写Admin密码修改————————363 from django.utils.translation import ugettext_lazy as _  # 语言国际化364 from django.utils.safestring import mark_safe365 from django.contrib.auth.models import PermissionsMixin366 # class UserProfile(AbstractBaseUser):367 class UserProfile(AbstractBaseUser,PermissionsMixin):368 # ————————35PerfectCRM实现CRM重写Admin密码修改————————369     email=models.EmailField(370         verbose_name='邮箱账号',371         max_length=255,372         unique=True#唯一  #登陆账号373     )374     name=models.CharField(max_length=32,verbose_name='用户名')375 376     # ————————35PerfectCRM实现CRM重写Admin密码修改————————377     password = models.CharField(_('password'), max_length=128, help_text=mark_safe('''修改密码'''))378     # ————————35PerfectCRM实现CRM重写Admin密码修改————————379 380     is_active = models.BooleanField(default=True,verbose_name='合法账号')#权限#合法账号381     is_superuser = models.BooleanField(default=False,verbose_name='超级账号') #超级账号382     objects = UserProfileManager()#创建账号 #关联这个函数383     USERNAME_FIELD ='email'#指定做为  #登陆账号384     REQUIRED_FIELDS = ['name']#必填字段385     def get_full_name(self):386         return self.email387     def get_short_name(self):388         #用户确认的电子邮件地址389         return self.email390     def __str__(self):391         return self.name392     def has_perm(self,perm,obj=None):393         #指明用户是否被认为活跃的。以反选代替删除帐号。394         #最简单的可能的答案:是的,总是395         return True   #有效 账号396     def has_module_perms(self, app_label):397         #指明用户是否可以登录到这个管理站点。398         # 最简单的可能的答案:是的,总是399         return True #职员状态400     @property401     def is_staff(self):402         '''“用户的员工吗?”'''403         #最简单的可能的答案:所有管理员都是员工404         return self.is_superuser#是不是超级用户状态405 # AUTH_USER_MODEL = 'crm.UserProfile'#使用自定的admin 表单   #settings.py406 # ————————34PerfectCRM实现CRM自定义用户————————407 408 """11角色表"""409 class Role(models.Model):410     name = models.CharField(unique=True,max_length=32)#角色名#CharField定长文本#角色名不可以重复#最长度=32字节411     def __str__(self):#__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。412         return self.name#返回 #角色名413     class Meta: #通过一个内嵌类 "class Meta" 给你的 model 定义元数据414         verbose_name_plural = "11角色表" #verbose_name_plural给你的模型类起一个更可读的名字415 416 """12标签表"""417 class Tag(models.Model):418     name =  models.CharField(max_length=64,unique=True) #标签名#CharField定长文本#最长度=64字节#不可以重复419     def __str__(self): #__str__()是Python的一个“魔幻”方法,这个方法定义了当object调用str()时应该返回的值。420         return self.name #返回 #标签名421     class Meta:#通过一个内嵌类 "class Meta" 给你的 model 定义元数据422         verbose_name_plural =  "12标签表" #verbose_name_plural给你的模型类起一个更可读的名字423 424 # ————————01PerfectCRM基本配置ADMIN————————
#models.py

 

 

 

 

 

1 # forms.py 2 # ————————47PerfectCRM实现CRM客户报名流程———————— 3 from crm import models  #数据库 4 from django.forms import ModelForm  #继承forms自定制 5 #报名 销售填写 6 class EnrollmentForm(ModelForm): 7     def __new__(cls, *args, **kwargs): 8         for field_name,field_obj in cls.base_fields.items(): 9             field_obj.widget.attrs['class'] = 'form-control'## 前端的样式10         return ModelForm.__new__(cls)11     class Meta:12         model= models.Enrollment13         fields= ['enrolled_class']14 # ————————47PerfectCRM实现CRM客户报名流程————————15 16 17 # ————————48PerfectCRM实现CRM客户报名流程学生合同————————18 #报名学员填 写19 class CustomerForm(ModelForm):20     def __new__(cls, *args, **kwargs):21         for field_name,field_obj in cls.base_fields.items():22             field_obj.widget.attrs['class'] = 'form-control'## 前端的样式23             if field_name in cls.Meta.readonly_fields:#如果不可修改24                 field_obj.widget.attrs['disabled'] = True## 前端的样式 灰色25         return ModelForm.__new__(cls)26 27     # ————————49PerfectCRM实现CRM客户报名流程学生合同表单验证————————28     def clean_qq(self):29         #print(self.instance.qq,self.cleaned_data['qq'],'9696969696')30         if self.instance.qq != self.cleaned_data['qq']:  #输入的值和 cleaned_data的值31             self.add_error('qq',"大神,请勿非法修改!")32         return self.cleaned_data['qq']33 34     def clean_consultant(self):35         if self.instance.consultant != self.cleaned_data['consultant']:36             self.add_error('consultant',"非法修改!不要尝试!")37         return self.cleaned_data['consultant']38 39     def clean_source(self):40         if self.instance.source != self.cleaned_data['source']:41             self.add_error('source',"非法修改!不能通过!")42         return self.cleaned_data['source']43     # ————————49PerfectCRM实现CRM客户报名流程学生合同表单验证————————44 45     class Meta:46         model=models.Customer#客户表47         fields='__all__'48         exclude=['tags','content','memo','status','referral_from','consult_courses']#排除,不显示49         readonly_fields=['qq','consultant','source']#不可修改50 # ————————48PerfectCRM实现CRM客户报名流程学生合同————————51 52 53 54 55 # ————————53PerfectCRM实现CRM客户报名流程缴费————————56 #缴费记录57 class PaymentForm(ModelForm):58     def __new__(cls, *args, **kwargs):59         for field_name,field_obj in cls.base_fields.items():60             field_obj.widget.attrs['class'] = 'form-control'## 前端的样式61         return ModelForm.__new__(cls)62     class Meta:63         model=models.Payment64         fields='__all__'65 66 # ————————53PerfectCRM实现CRM客户报名流程缴费————————
# forms.py

 

 

1 {#not_audit.html#} 2 {## # ————————53PerfectCRM实现CRM客户报名流程缴费————————#} 3 {% extends 'bpm_master/bpm_sample.html' %} 4 {% block right-container-content %} {#自定义内容开始 右边页面内容#} 5     
6
7

待缴费 | 已缴费

8
9
10
11
12
13
14
15 16
17
18
19
20
21
22
23
24 {% for foo in sign %}25 {# {% if foo.contract_agreed and foo.contract_approved == false %}#}26 {% if foo.contract_approved and not foo.Pay_cost %}27
28
29
30
31
32 33
34
35
36
37
38
39 {% endif %}40 {% endfor %}41
42
客户名字 客户QQ 手机号码 咨询顾问 所报班级 报名课程顾问 合同审核 合同状态 日期时间
{ { foo.customer.name }} { { foo.customer }} { { foo.customer.phone }} { { foo.customer.consultant }} { { foo.enrolled_class }} { { foo.consultant }} { { foo.contract_review }} { { foo.contract_approved }} { { foo.date }}
43
44
45 {% endblock %}46 47 {## # ————————53PerfectCRM实现CRM客户报名流程缴费————————#}
{#not_audit.html#}

 

 

 

1 {#already_payment.html#} 2 {## # ————————53PerfectCRM实现CRM客户报名流程缴费————————#} 3 {% extends 'bpm_master/bpm_sample.html' %} 4 {% block right-container-content %} {#自定义内容开始 右边页面内容#} 5     
6
7

已缴费 | 待缴费

8
9
10
11
12
13
14
15 16
17
18
19
20
21
22
23
24 {% for foo in sign %}25 {# {% if foo.contract_agreed and foo.contract_approved == false %}#}26 {% if foo.contract_approved and foo.Pay_cost %}27
28
29
30
31
32 33
34
35
36
37
38
39 {% endif %}40 {% endfor %}41
42
客户名字 客户QQ 手机号码 咨询顾问 所报班级 报名课程顾问 合同审核 合同状态 日期时间
{ { foo.customer.name }} { { foo.customer }} { { foo.customer.phone }} { { foo.customer.consultant }} { { foo.enrolled_class }} { { foo.consultant }} { { foo.contract_review }} { { foo.contract_approved }} { { foo.date }}
43
44
45 {% endblock %}46 47 {## # ————————53PerfectCRM实现CRM客户报名流程缴费————————#}
{#already_payment.html#}

 

 

 

1 {#payment.html#} 2 {## # ————————53PerfectCRM实现CRM客户报名流程缴费————————#} 3 {% extends 'bpm_master/bpm_sample.html' %} 4 {% block right-container-content %} {#自定义内容开始 右边页面内容#} 5     
6

学员缴费:

7
8
9
{% csrf_token %}10
12
13
{
{ enroll_obj.customer.name }}
14
16
17
{
{ enroll_obj.customer }}
18
20
21
{
{ enroll_obj.customer.phone }}
22
24
25
{
{ enroll_obj.customer.consultant }}
26
28
29
{
{ enroll_obj.enrolled_class }}
30
32
33
{
{ enroll_obj.consultant }}
34
36
37
{
{ enroll_obj.contract_review }}
38
40
41
42
{
{ errors.err }}
43
44
46
47
{
{ request.user.name }}
48
11 15 19 23 27 31 35 39 45 49
50
51
返回52
53
54
55 56 57

58
59
60
61
62
63
64
65
66 67
68
69 70
71
72
73
74
75
76 {% for foo in sign %}77 {% if foo.customer == enroll_obj.customer %}78
79
80
81
82
83
84 85
86
87 88
89
90
91
92 {% endif %}93 {% endfor %}94
95
客户名字 客户QQ 手机号码 咨询顾问 所报课程 报名课程顾问 合同审核 缴费金额 财务人员 日期时间
{
{ foo.customer.name }}
{
{ foo.customer }}
{
{ foo.customer.phone }}
{
{ foo.customer.consultant }}
{
{ foo.course }}
{
{ enroll_obj.consultant }}
{
{ enroll_obj.contract_review }}
{
{ foo.amount }}
{
{ foo.consultant }}
{
{ foo.date }}
96
97 {% endblock %}98 {## # ————————53PerfectCRM实现CRM客户报名流程缴费————————#}
{#payment.html#}

 

 

 

转载于:https://www.cnblogs.com/ujq3/p/8941288.html

你可能感兴趣的文章
定义函数
查看>>
网络虚拟化技术(二): TUN/TAP MACVLAN MACVTAP
查看>>
MQTT协议笔记之mqtt.io项目HTTP协议支持
查看>>
(转)jQuery中append(),prepend()与after(),before()的区别
查看>>
Tecplot: Legend和图像中 Dashed/Dash dot/Long dash 等虚线显示没有区别的问题
查看>>
win8 开发之旅(2) --连连看游戏开发 项目错误的总结
查看>>
视频转换工具ffmpeg
查看>>
一、 object c -基础学习第一天 如何定义一个类
查看>>
C#调用C++编译的DLL详解
查看>>
Kali Linux的安装
查看>>
我的大学生活-5-08-赵心宁
查看>>
黑马程序员-Java基础-反射
查看>>
bzoj1708[Usaco2007 Oct]Money奶牛的硬币(背包方案数dp)
查看>>
P2700逐个击破(并查集/树形dp)
查看>>
展望2018
查看>>
python几大排序算法
查看>>
hdu 4619 二分图最大匹配 ——最大独立集
查看>>
VM CentOS 问题汇总
查看>>
这段时间的小结
查看>>
ANDROID_MARS学习笔记_S01原始版_021_MP3PLAYER001_下载mp3文件
查看>>